home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / MATH.SWG / 0021_Trig & Calc Functions.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-31  |  17KB  |  539 lines

  1. ==============================================================================
  2.  BBS: «« The Information and Technology Exchan
  3.   To: JEFFREY HUNTSMAN             Date: 11-27─91 (09:08)
  4. From: FLOOR NAAIJKENS            Number: 3162   [101] PASCAL
  5. Subj: CALC (1)                   Status: Public
  6. ------------------------------------------------------------------------------
  7. {$O+}
  8. {
  9.                        F i l e    I n f o r m a t i o n
  10.  
  11. * DESCRIPTION
  12. Supplies missing trigonometric functions for Turbo Pascal 5.5. Also
  13. provides hyperbolic, logarithmic, power, and root functions. All trig
  14. functions accessibile by radians, decimal degrees, degrees-minutes-seconds
  15. and a global DegreeType.
  16.  
  17. }
  18. unit PTD_Calc;
  19.  
  20. (*  PTD_Calc  -  Supplies missing trigonometric functions for Turbo Pascal 5.5
  21.  *           Also provides hyperbolic, logarithmic, power, and root functions.
  22.  *           All trig functions accessible by radians, decimal degrees,
  23.  *           degrees-minutes-seconds, and a global DegreeType.  Conversions
  24.  *           between these are supplied.
  25.  *
  26.  *)
  27.  
  28. interface
  29.  
  30. type
  31.   DegreeType =  record
  32.                   Degrees, Minutes, Seconds : real;
  33.                 end;
  34. const
  35.   Infinity = 9.9999999999E+37;
  36.  
  37. {  Radians  }
  38. { sin, cos, and arctan are predefined }
  39.  
  40. function Tan( Radians : real ) : real;
  41. function ArcSin( InValue : real ) : real;
  42. function ArcCos( InValue : real ) : real;
  43.  
  44. {  Degrees, expressed as a real number  }
  45.  
  46. function DegreesToRadians( Degrees : real ) : real;
  47. function RadiansToDegrees( Radians : real ) : real;
  48. function Sin_Degree( Degrees : real ) : real;
  49. function Cos_Degree( Degrees : real ) : real;
  50. function Tan_Degree( Degrees : real ) : real;
  51. function ArcSin_Degree( Degrees : real ) : real;
  52. function ArcCos_Degree( Degrees : real ) : real;
  53. function ArcTan_Degree( Degrees : real ) : real;
  54.  
  55. {  Degrees, in Degrees, Minutes, and Seconds, as real numbers  }
  56.  
  57. function DegreePartsToDegrees( Degrees, Minutes, Seconds : real ) : real;
  58. function DegreePartsToRadians( Degrees, Minutes, Seconds : real ) : real;
  59. procedure DegreesToDegreeParts( DegreesIn : real;
  60.                                 var Degrees, Minutes, Seconds : real );
  61. procedure RadiansToDegreeParts( Radians : real;
  62.                                 var Degrees, Minutes, Seconds : real );
  63. function Sin_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  64. function Cos_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  65. function Tan_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  66. function ArcSin_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  67. function ArcCos_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  68. function ArcTan_DegreeParts( Degrees, Minutes, Seconds : real ) : real;
  69.  
  70. {  Degrees, expressed as DegreeType ( reals in record ) }
  71.  
  72. function DegreeTypeToDegrees( DegreeVar : DegreeType ) : real;
  73. function DegreeTypeToRadians( DegreeVar : DegreeType ) : real;
  74. procedure DegreeTypeToDegreeParts( DegreeVar : DegreeType;
  75.                                    var Degrees, Minutes, Seconds : real );
  76. procedure DegreesToDegreeType( Degrees : real; var DegreeVar : DegreeType );
  77. procedure RadiansToDegreeType( Radians : real; var DegreeVar : DegreeType );
  78. procedure DegreePartsToDegreeType( Degrees, Minutes, Seconds : real;
  79.                                    var DegreeVar : DegreeType );
  80. function Sin_DegreeType( DegreeVar : DegreeType ) : real;
  81. function Cos_DegreeType( DegreeVar : DegreeType ) : real;
  82. function Tan_DegreeType( DegreeVar : DegreeType ) : real;
  83. function ArcSin_DegreeType( DegreeVar : DegreeType ) : real;
  84. function ArcCos_DegreeType( DegreeVar : DegreeType ) : real;
  85. function ArcTan_DegreeType( DegreeVar : DegreeType ) : real;
  86.  
  87. {  Hyperbolic functions  }
  88.  
  89. function Sinh( Invalue : real ) : real;
  90. function Cosh( Invalue : real ) : real;
  91. function Tanh( Invalue : real ) : real;
  92. function Coth( Invalue : real ) : real;
  93. function Sech( Invalue : real ) : real;
  94. function Csch( Invalue : real ) : real;
  95. function ArcSinh( Invalue : real ) : real;
  96. function ArcCosh( Invalue : real ) : real;
  97. function ArcTanh( Invalue : real ) : real;
  98. function ArcCoth( Invalue : real ) : real;
  99. function ArcSech( Invalue : real ) : real;
  100. function ArcCsch( Invalue : real ) : real;
  101.  
  102. {  Logarithms, Powers, and Roots  }
  103.  
  104. { e to the x  is  exp() }
  105. { natural log is  ln()  }
  106. function Log10( InNumber : real ) : real;
  107. function Log( Base, InNumber : real ) : real;  { log of any base }
  108. function Power( InNumber, Exponent : real ) : real;
  109. function Root( InNumber, TheRoot : real ) : real;
  110.  
  111.  
  112. {----------------------------------------------------------------------}
  113. implementation
  114.  
  115. const
  116.   RadiansPerDegree =  0.017453292520;
  117.   DegreesPerRadian = 57.295779513;
  118.   MinutesPerDegree =   60.0;
  119.   SecondsPerDegree = 3600.0;
  120.   SecondsPerMinute = 60.0;
  121.   LnOf10 = 2.3025850930;
  122.  
  123. {-----------}
  124. {  Radians  }
  125. {-----------}
  126.  
  127. { sin, cos, and arctan are predefined }
  128.  
  129. function Tan { ( Radians : real ) : real };
  130.   { note: returns Infinity where appropriate }
  131.   var
  132.     CosineVal : real;
  133.     TangentVal : real;
  134.   begin
  135.   CosineVal := cos( Radians );
  136.   if CosineVal = 0.0 then
  137.     Tan := Infinity
  138.   else
  139.     begin
  140.     TangentVal := sin( Radians ) / CosineVal;
  141.     if ( TangentVal < -Infinity ) or ( TangentVal > Infinity ) then
  142.       Tan := Infinity
  143.     else
  144.       Tan := TangentVal;
  145.     end;
  146.   end;
  147.  
  148. function ArcSin{ ( InValue : real ) : real };
  149.   { notes: 1) exceeding input range of -1 through +1 will cause runtime error }
  150.   {        2) only returns principal values }
  151.   {             ( -pi/2 through pi/2 radians ) ( -90 through +90 degrees ) }
  152.   begin
  153.   if abs( InValue ) = 1.0 then
  154.     ArcSin := pi / 2.0
  155.   else
  156.     ArcSin := arctan( InValue / sqrt( 1 - InValue * InValue ) );
  157.   end;
  158.  
  159. function ArcCos{ ( InValue : real ) : real };
  160.   { notes: 1) exceeding input range of -1 through +1 will cause runtime error }
  161.   {        2) only returns principal values }
  162.   {             ( 0 through pi radians ) ( 0 through +180 degrees ) }
  163.   var
  164.     Result : real;
  165.   begin
  166.   if InValue = 0.0 then
  167.     ArcCos := pi / 2.0
  168.   else
  169.     begin
  170.     Result := arctan( sqrt( 1 - InValue * InValue ) / InValue );
  171.     if InValue < 0.0 then
  172.       ArcCos := Result + pi
  173.     else
  174.       ArcCos := Result;
  175.     end;
  176.   end;
  177.  
  178. {---------------------------------------}
  179. {  Degrees, expressed as a real number  }
  180. {---------------------------------------}
  181.  
  182. function DegreesToRadians{ ( Degrees : real ) : real };
  183.   begin
  184.   DegreesToRadians := Degrees * RadiansPerDegree;
  185.   end;
  186.  
  187. function RadiansToDegrees{ ( Radians : real ) : real };
  188.   begin
  189.   RadiansToDegrees := Radians * DegreesPerRadian;
  190.   end;
  191.  
  192. function Sin_Degree{ ( Degrees : real ) : real };
  193.   begin
  194.   Sin_Degree := sin( DegreesToRadians( Degrees ) );
  195.   end;
  196.  
  197. function Cos_Degree{ ( Degrees : real ) : real };
  198.   begin
  199.   Cos_Degree := cos( DegreesToRadians( Degrees ) );
  200.   end;
  201.  
  202. function Tan_Degree{ ( Degrees : real ) : real };
  203.   begin
  204.   Tan_Degree := Tan( DegreesToRadians( Degrees ) );
  205.  
  206. <ORIGINAL MESSAGE OVER 200 LINES, SPLIT IN 2 OR MORE>
  207. ==============================================================================
  208.  BBS: «« The Information and Technology Exchan
  209.   To: JEFFREY HUNTSMAN             Date: 11-27─91 (09:08)
  210. From: FLOOR NAAIJKENS            Number: 3163   [101] PASCAL
  211. Subj: CALC (1)           <CONT>  Status: Public
  212. ------------------------------------------------------------------------------
  213.   end;
  214.  
  215. function ArcSin_Degree{ ( Degrees : real ) : real };
  216.   begin
  217.   ArcSin_Degree := ArcSin( DegreesToRadians( Degrees ) );
  218.   end;
  219.  
  220. function ArcCos_Degree{ ( Degrees : real ) : real };
  221.   begin
  222.   ArcCos_Degree := ArcCos( DegreesToRadians( Degrees ) );
  223.   end;
  224.  
  225. function ArcTan_Degree{ ( Degrees : real ) : real };
  226.   begin
  227.   ArcTan_Degree := arctan( DegreesToRadians( Degrees ) );
  228.   end;
  229.  
  230. --- D'Bridge 1.30 demo/922115
  231.  * Origin: EURO-ONLINE Home of The Fast Commander (2:500/233)
  232. ==============================================================================
  233.  BBS: «« The Information and Technology Exchan
  234.   To: JEFFREY HUNTSMAN             Date: 11-27─91 (09:08)
  235. From: FLOOR NAAIJKENS            Number: 3164   [101] PASCAL
  236. Subj: CALC (2)                   Status: Public
  237. ------------------------------------------------------------------------------
  238.  
  239. {--------------------------------------------------------------}
  240. {  Degrees, in Degrees, Minutes, and Seconds, as real numbers  }
  241. {--------------------------------------------------------------}
  242.  
  243. function DegreePartsToDegrees{ ( Degrees, Minutes, Seconds : real ) : real };
  244.   begin
  245.   DegreePartsToDegrees := Degrees + ( Minutes / MinutesPerDegree ) +
  246.                                        ( Seconds / SecondsPerDegree );
  247.   end;
  248.  
  249. function DegreePartsToRadians{ ( Degrees, Minutes, Seconds : real ) : real };
  250.   begin
  251.   DegreePartsToRadians := DegreesToRadians( DegreePartsToDegrees( Degrees,
  252.                                                         Minutes, Seconds ) );
  253.   end;
  254.  
  255. procedure DegreesToDegreeParts{ ( DegreesIn : real;
  256.                                   var Degrees, Minutes, Seconds : real ) };
  257.   begin
  258.   Degrees := int( DegreesIn );
  259.   Minutes := ( DegreesIn - Degrees ) * MinutesPerDegree;
  260.   Seconds := frac( Minutes );
  261.   Minutes := int( Minutes );
  262.   Seconds := Seconds * SecondsPerMinute;
  263.   end;
  264.  
  265. procedure RadiansToDegreeParts{ ( Radians : real;
  266.                                   var Degrees, Minutes, Seconds : real ) };
  267.   begin
  268.   DegreesToDegreeParts( RadiansToDegrees( Radians ),
  269.                           Degrees, Minutes, Seconds );
  270.   end;
  271.  
  272. function Sin_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  273.   begin
  274.   Sin_DegreeParts := sin( DegreePartsToRadians( Degrees, Minutes, Seconds ) );
  275.   end;
  276.  
  277. function Cos_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  278.   begin
  279.   Cos_DegreeParts := cos( DegreePartsToRadians( Degrees, Minutes, Seconds ) );
  280.   end;
  281.  
  282. function Tan_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  283.   begin
  284.   Tan_DegreeParts := Tan( DegreePartsToRadians( Degrees, Minutes, Seconds ) );
  285.   end;
  286.  
  287. function ArcSin_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  288.   begin
  289.   ArcSin_DegreeParts := ArcSin( DegreePartsToRadians( Degrees,
  290.                                                       Minutes, Seconds ) );
  291.   end;
  292.  
  293. function ArcCos_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  294.   begin
  295.   ArcCos_DegreeParts := ArcCos( DegreePartsToRadians( Degrees,
  296.                                                       Minutes, Seconds ) );
  297.   end;
  298.  
  299. function ArcTan_DegreeParts{ ( Degrees, Minutes, Seconds : real ) : real };
  300.   begin
  301.   ArcTan_DegreeParts := arctan( DegreePartsToRadians( Degrees,
  302.                                                       Minutes, Seconds ) );
  303.   end;
  304.  
  305. {-------------------------------------------------------}
  306. {  Degrees, expressed as DegreeType ( reals in record ) }
  307. {-------------------------------------------------------}
  308.  
  309. function DegreeTypeToDegrees{ ( DegreeVar : DegreeType ) : real };
  310.   begin
  311.   DegreeTypeToDegrees := DegreePartsToDegrees( DegreeVar.Degrees,
  312.                                        DegreeVar.Minutes, DegreeVar.Seconds );
  313.   end;
  314.  
  315. function DegreeTypeToRadians{ ( DegreeVar : DegreeType ) : real };
  316.   begin
  317.   DegreeTypeToRadians := DegreesToRadians( DegreeTypeToDegrees( DegreeVar ) );
  318.   end;
  319.  
  320. procedure DegreeTypeToDegreeParts{ ( DegreeVar : DegreeType;
  321.                                      var Degrees, Minutes, Seconds : real ) };
  322.   begin
  323.   Degrees := DegreeVar.Degrees;
  324.   Minutes := DegreeVar.Minutes;
  325.   Seconds := DegreeVar.Seconds;
  326.   end;
  327.  
  328. procedure DegreesToDegreeType{ ( Degrees : real; var DegreeVar : DegreeType )};
  329.   begin
  330.   DegreesToDegreeParts( Degrees, DegreeVar.Degrees,
  331.                         DegreeVar.Minutes, DegreeVar.Seconds );
  332.   end;
  333.  
  334. procedure RadiansToDegreeType{ ( Radians : real; var DegreeVar : DegreeType )};
  335.   begin
  336.   DegreesToDegreeParts( RadiansToDegrees( Radians ), DegreeVar.Degrees,
  337.                         DegreeVar.Minutes, DegreeVar.Seconds );
  338.   end;
  339.  
  340. procedure DegreePartsToDegreeType{ ( Degrees, Minutes, Seconds : real;
  341.                                      var DegreeVar : DegreeType ) };
  342.   begin
  343.   DegreeVar.Degrees := Degrees;
  344.   DegreeVar.Minutes := Minutes;
  345.   DegreeVar.Seconds := Seconds;
  346.   end;
  347.  
  348. function Sin_DegreeType{ ( DegreeVar : DegreeType ) : real };
  349.   begin
  350.   Sin_DegreeType := sin( DegreeTypeToRadians( DegreeVar ) );
  351.   end;
  352.  
  353. function Cos_DegreeType{ ( DegreeVar : DegreeType ) : real };
  354.   begin
  355.   Cos_DegreeType := cos( DegreeTypeToRadians( DegreeVar ) );
  356.   end;
  357.  
  358. function Tan_DegreeType{ ( DegreeVar : DegreeType ) : real };
  359.   begin
  360.   Tan_DegreeType := Tan( DegreeTypeToRadians( DegreeVar ) );
  361.   end;
  362.  
  363. --- D'Bridge 1.30 demo/922115
  364.  * Origin: EURO-ONLINE Home of The Fast Commander (2:500/233)
  365. ==============================================================================
  366.  BBS: «« The Information and Technology Exchan
  367.   To: JEFFREY HUNTSMAN             Date: 11-27─91 (09:08)
  368. From: FLOOR NAAIJKENS            Number: 3165   [101] PASCAL
  369. Subj: CALC (3)                   Status: Public
  370. ------------------------------------------------------------------------------
  371. function ArcSin_DegreeType{ ( DegreeVar : DegreeType ) : real };
  372.   begin
  373.   ArcSin_DegreeType := ArcSin( DegreeTypeToRadians( DegreeVar ) );
  374.   end;
  375.  
  376. function ArcCos_DegreeType{ ( DegreeVar : DegreeType ) : real };
  377.   begin
  378.   ArcCos_DegreeType := ArcCos( DegreeTypeToRadians( DegreeVar ) );
  379.   end;
  380.  
  381. function ArcTan_DegreeType{ ( DegreeVar : DegreeType ) : real };
  382.   begin
  383.   ArcTan_DegreeType := arctan( DegreeTypeToRadians( DegreeVar ) );
  384.   end;
  385.  
  386. {------------------------}
  387. {  Hyperbolic functions  }
  388. {------------------------}
  389.  
  390. function Sinh{ ( Invalue : real ) : real };
  391.   const
  392.     MaxValue = 88.029691931;  { exceeds standard turbo precision }
  393.   var
  394.     Sign : real;
  395.   begin
  396.   Sign := 1.0;
  397.   if Invalue < 0 then
  398.     begin
  399.     Sign := -1.0;
  400.     Invalue := -Invalue;
  401.     end;
  402.   if Invalue > MaxValue then
  403.     Sinh := Infinity
  404.   else
  405.     Sinh := ( exp( Invalue ) - exp( -Invalue ) ) / 2.0 * Sign;
  406.   end;
  407.  
  408. function Cosh{ ( Invalue : real ) : real };
  409.   const
  410.     MaxValue = 88.029691931;  { exceeds standard turbo precision }
  411.   begin
  412.   Invalue := abs( Invalue );
  413.   if Invalue > MaxValue then
  414.     Cosh := Infinity
  415.   else
  416.     Cosh := ( exp( Invalue ) + exp( -Invalue ) ) / 2.0;
  417.   end;
  418.  
  419. function Tanh{ ( Invalue : real ) : real };
  420.   begin
  421.   Tanh := Sinh( Invalue ) / Cosh( Invalue );
  422.   end;
  423.  
  424. function Coth{ ( Invalue : real ) : real };
  425.   begin
  426.   Coth := Cosh( Invalue ) / Sinh( Invalue );
  427.   end;
  428.  
  429. function Sech{ ( Invalue : real ) : real };
  430.   begin
  431.   Sech := 1.0 / Cosh( Invalue );
  432.   end;
  433.  
  434. function Csch{ ( Invalue : real ) : real };
  435.   begin
  436.   Csch := 1.0 / Sinh( Invalue );
  437.   end;
  438.  
  439. function ArcSinh{ ( Invalue : real ) : real };
  440.   var
  441.     Sign : real;
  442.   begin
  443.   Sign := 1.0;
  444.   if Invalue < 0 then
  445.     begin
  446.     Sign := -1.0;
  447.     Invalue := -Invalue;
  448.     end;
  449.   ArcSinh := ln( Invalue + sqrt( Invalue*Invalue + 1 ) ) * Sign;
  450.   end;
  451.  
  452. function ArcCosh{ ( Invalue : real ) : real };
  453.   var
  454.     Sign : real;
  455.   begin
  456.   Sign := 1.0;
  457.   if Invalue < 0 then
  458.     begin
  459.     Sign := -1.0;
  460.     Invalue := -Invalue;
  461.     end;
  462.   ArcCosh := ln( Invalue + sqrt( Invalue*Invalue - 1 ) ) * Sign;
  463.   end;
  464.  
  465. function ArcTanh{ ( Invalue : real ) : real };
  466.   var
  467.     Sign : real;
  468.   begin
  469.   Sign := 1.0;
  470.   if Invalue < 0 then
  471.     begin
  472.     Sign := -1.0;
  473.     Invalue := -Invalue;
  474.     end;
  475.   ArcTanh := ln( ( 1 + Invalue ) / ( 1 - Invalue ) ) / 2.0 * Sign;
  476.   end;
  477.  
  478. function ArcCoth{ ( Invalue : real ) : real };
  479.   begin
  480.   ArcCoth := ArcTanh( 1.0 / Invalue );
  481.   end;
  482.  
  483. function ArcSech{ ( Invalue : real ) : real };
  484.   begin
  485.   ArcSech := ArcCosh( 1.0 / Invalue );
  486.   end;
  487.  
  488. function ArcCsch{ ( Invalue : real ) : real };
  489.   begin
  490.   ArcCsch := ArcSinh( 1.0 / Invalue );
  491.   end;
  492.  
  493. {---------------------------------}
  494. {  Logarithms, Powers, and Roots  }
  495. {---------------------------------}
  496.  
  497. { e to the x  is  exp() }
  498. { natural log is  ln()  }
  499.  
  500. function Log10{ ( InNumber : real ) : real };
  501.   begin
  502.   Log10 := ln( InNumber ) / LnOf10;
  503.   end;
  504.  
  505. function Log{ ( Base, InNumber : real ) : real };  { log of any base }
  506.   begin
  507.   Log := ln( InNumber ) / ln( Base );
  508.   end;
  509.  
  510. function Power{ ( InNumber, Exponent : real ) : real };
  511.   begin
  512.   if InNumber > 0.0 then
  513.     Power := exp( Exponent * ln( InNumber ) )
  514.   else if InNumber = 0.0 then
  515.     Power := 1.0
  516.   else { WE DON'T force a runtime error, we define a function to provide
  517.          negative logarithms! }
  518.     If Exponent=Trunc(Exponent) Then
  519.       Power := (-2*(Trunc(Exponent) Mod 2)+1) * Exp(Exponent * Ln( -InNumber ) )
  520.       Else Power := Trunc(1/(Exponent-Exponent));
  521.               { NOW WE generate a runtime error }
  522.   end;
  523.  
  524. function Root{ ( InNumber, TheRoot : real ) : real };
  525.   begin
  526.   Root := Power( InNumber, ( 1.0 / TheRoot ) );
  527.   end;
  528.  
  529. end. { unit PTD_Calc }
  530.  
  531.  
  532.  
  533.  
  534.  
  535. P.S. Enjoy yourself!
  536.  
  537. --- D'Bridge 1.30 demo/922115
  538.  * Origin: EURO-ONLINE Home of The Fast Commander (2:500/233)
  539.